home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1994-09-22 | 12.5 KB | 454 lines |
- IMPLEMENTATION MODULE Screen;
-
- (*****************************************************************************)
- (* Es werden einfach nur die Escapesequenzen an die Terminalemulation ausge- *)
- (* geben, dies geschieht direkt ueber die Betriebssystemfunktion 'Bconout', *)
- (* da eine Umlenkung auf Dateien oder andere Geraete nicht sinnvoll waere. *)
- (* Einige Funktionen lassen sich auch nur direkt ueber Betriebssystemfunkti- *)
- (* onen erreichen. *)
- (*___________________________________________________________________________*)
- (* 05-Jan-90 , hk *)
- (* Beginn *)
- (* 26-Jan-90 , hk *)
- (* erste Version *)
- (* 30-Jan-90 , hk *)
- (* "WriteStr", "WriteConStr", "WriteRawConStr" neu *)
- (* 05-Mae-90 , hk *)
- (* Traps aus "TRAPdefs" importiert *)
- (*****************************************************************************)
-
- FROM SYSTEM IMPORT (* PROC *) REG, VAL, INLINE;
-
- FROM TRAPdefs IMPORT (* CONST*) d0,
- (* PROC *) BIOS2w, XBIOS2w, GEMDOS1w;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- CONST Bconout = 3; (* BIOS-Funktionsnummer *)
- Cursconf = 21; (* XBIOS-Funktionsnummer *)
- Cconout = 2; (* GEMDOS-Funktionsnr. *)
-
- VBlankRate = 14;(* in ms bei Schwarzweiss *)
-
- VAR BlinkRate : CARDINAL;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- (* Hier erst mal einige Funktionen, die nicht ueber die
- ESCAPE-Sequenzen der Terminalemulation implementiert
- werden, sondern direkte Betriebssystemeaufrufe sind.
- *)
-
- PROCEDURE WriteRawCon ((* EIN/ -- *) zeichen : CHAR );
- (*T*)
- CONST RAWCON = 5; (* Geraet: Konsole ohne Terminalemulation *)
-
- BEGIN
- BIOS2w( ORD( zeichen ), RAWCON, Bconout );
- END WriteRawCon;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE WriteCon ((* EIN/ -- *) zeichen : CHAR );
- (*T*)
- CONST CON = 2; (* Geraet: Konsole mit Terminalemulation *)
-
- BEGIN
- BIOS2w( ORD( zeichen ), CON, Bconout );
- END WriteCon;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE WriteChar ((* EIN/ -- *) zeichen : CHAR );
- (*T*)
- BEGIN
- GEMDOS1w( ORD( zeichen ), Cconout );
- END WriteChar;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE WriteRawConStr ((* EIN/ -- *) string : ARRAY OF CHAR );
- (*T*)
- BEGIN
- (*
- RAWCON EQU 5 ; Geraetenummer
- Bconout EQU 3 ; BIOS-Funktionsnummer
- BIOS EQU 13 ; Nummer des TRAPs
-
- string EQU 12 ; Offsets der Parameter
- HIGH EQU string + 4 ;
-
- WriteRawConStr:
- movea.l string(a6), a3 ; a3 -> <string>
- move.w HIGH(a6), d3 ; d3 := HIGH(string);
- moveq #0, d4 ; auszugebendes Zeichen auf Wortlaenge
- ; a3, d3, d4 werden durch Betriebssystem-
- ; funktionen nicht veraendert ( hoffentlich )
- wrtlp:
- move.b (a3)+, d4 ; d4 := naechstes auszugebendes Zeichen
- beq.s ende ; B: Ende des Strings ( dynamisch )
- move.w d4, -(sp)
- move.w #RAWCON, -(sp)
- move.w #Bconout, -(sp)
- trap #BIOS
- addq.l #6, sp ; innerhalb einer Schleife lieber Stackkor.
- dbra d3, wrtlp : B: String noch nicht zuende ( statisch )
- ende:
- *)
- INLINE( 266EH,000CH,362EH,0010H,7800H,181BH,6712H,3F04H,3F3CH );
- INLINE( 0005H,3F3CH,0003H,4E4DH,5C8FH,51CBH,0FFECH );
-
- END WriteRawConStr;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE WriteConStr ((* EIN/ -- *) string : ARRAY OF CHAR );
- (*T*)
- BEGIN
- (*
- CON EQU 2
- Bconout EQU 3
- BIOS EQU 13
-
- string EQU 12
- HIGH EQU string + 4
-
- WriteConStr:
- movea.l string(a6), a3
- move.w HIGH(a6), d3
- moveq #0, d4
- wrtlp:
- move.b (a3)+, d4
- beq.s ende
- move.w d4, -(sp)
- move.w #CON, -(sp)
- move.w #Bconout, -(sp)
- trap #BIOS
- addq.l #6, sp
- dbra d3, wrtlp
- ende:
- *)
- INLINE( 266EH,000CH,362EH,0010H,7800H,181BH,6712H,3F04H,3F3CH );
- INLINE( 0002H,3F3CH,0003H,4E4DH,5C8FH,51CBH,0FFECH );
-
- END WriteConStr;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE WriteStr ((* EIN/ -- *) string : ARRAY OF CHAR );
- (*T*)
- VAR Puffer : CHAR;
-
- BEGIN
- (*
- GEMDOS EQU 1
- Cconws EQU 9
-
- string EQU 12
- HIGH EQU string + 4
-
- WriteStr:
- movea.l string(a6), a0
- move.w HIGH(a6), d0
- clr.b 1(a0,d0.w) ; damit ist der string auch mit einem
- ; Nullbyte abgeschlossen, wenn er das
- ; ganze Feld ausfuellt. Durch die lokale
- ; Variable ist hinter <string> auf jeden
- ; Fall noch Platz.
- move.l a0, -(sp) ; ADR( string )
- move.w #Cconws, -(sp) ; GEMDOS-Funktion auswaehlen...
- trap #GEMDOS ;...und ausfuehren
-
- *)
- INLINE( 206EH,000CH,302EH,0010H,4230H,0001H,2F08H,3F3CH,0009H,4E41H );
-
- END WriteStr;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorOn;
- (*T*)
- CONST CursShow = 1; (* Funktionsnummer *)
-
- BEGIN
- XBIOS2w( 0, CursShow, Cursconf );
- END CursorOn;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorOff;
- (*T*)
- CONST CursHide = 0; (* Funktionsnummer *)
-
- BEGIN
- XBIOS2w( 0, CursHide, Cursconf );
- END CursorOff;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorBlinkOn;
- (*T*)
- CONST CursBlink = 2; (* Funktionsnummer *)
-
- BEGIN
- XBIOS2w( 0, CursBlink, Cursconf );
- END CursorBlinkOn;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorBlinkOff;
- (*T*)
- CONST CursNoBlink = 3; (* Funktionsnummer *)
-
- BEGIN
- XBIOS2w( 0, CursNoBlink, Cursconf );
- END CursorBlinkOff;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE SetBlinkRate ((* EIN/ -- *) ms : CARDINAL );
- (*T*)
- CONST CursSetRate = 4; (* Funktionsnummer *)
-
- BEGIN
- XBIOS2w( ms DIV ( VBlankRate * 2 ), CursSetRate, Cursconf );
- END SetBlinkRate;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE GetBlinkRate ((* -- /AUS *) VAR ms : CARDINAL );
- (*T*)
- CONST CursGetRate = 5; (* Funktionsnummer *)
-
- BEGIN
- XBIOS2w( 0, CursGetRate, Cursconf );
-
- ms := VAL( CARDINAL, REG( d0 )) * VBlankRate * 2;
- END GetBlinkRate;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE RestoreBlinkRate;
- (*T*)
- CONST CursSetRate = 4; (* Funktionsnummer *)
-
- BEGIN
- XBIOS2w( BlinkRate, CursSetRate, Cursconf );
- END RestoreBlinkRate;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE Escape ((* EIN/ -- *) funktion : CHAR );
- (*T*)
- CONST ESC = 33C;
-
- BEGIN
- WriteCon( ESC );
- WriteCon( funktion );
- END Escape;
-
- (*===========================================================================*)
-
- PROCEDURE CursorUp;
- (*T*)
- BEGIN
- Escape('A');
- END CursorUp;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorUpScroll;
- (*T*)
- BEGIN
- Escape('I');
- END CursorUpScroll;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorDown;
- (*T*)
- BEGIN
- Escape('B');
- END CursorDown;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorRight;
- (*T*)
- BEGIN
- Escape('C');
- END CursorRight;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorLeft;
- (*T*)
- BEGIN
- Escape('D');
- END CursorLeft;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CursorHome;
- (*T*)
- BEGIN
- Escape('H');
- END CursorHome;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE ClearScreen;
- (*T*)
- BEGIN
- Escape('E');
- END ClearScreen;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE EraseToEndOfPage;
- (*T*)
- BEGIN
- Escape('J');
- END EraseToEndOfPage;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE EraseToEndOfLine;
- (*T*)
- BEGIN
- Escape('K');
- END EraseToEndOfLine;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE EraseLine;
- (*T*)
- BEGIN
- Escape('l');
- END EraseLine;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE EraseToStartOfPage;
- (*T*)
- BEGIN
- Escape('d');
- END EraseToStartOfPage;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE EraseToStartOfLine;
- (*T*)
- BEGIN
- Escape('o');
- END EraseToStartOfLine;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE InsertLine;
- (*T*)
- BEGIN
- Escape('L');
- END InsertLine;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE DeleteLine;
- (*T*)
- BEGIN
- Escape('M');
- END DeleteLine;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE GotoXY ((* EIN/ -- *) spalte,
- (* EIN/ -- *) zeile : CARDINAL );
- (*T*)
- BEGIN
- (* Erst mal auf korrekte Laenge stutzen
- *)
- IF zeile > 24 THEN zeile := 24; END;
- IF spalte > 79 THEN zeile := 79; END;
-
- Escape('Y');
- WriteCon( CHR( 32 + zeile ));
- WriteCon( CHR( 32 + spalte ));
-
- END GotoXY;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE SaveCursorPos;
- (*T*)
- BEGIN
- Escape('j');
- END SaveCursorPos;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE RestoreCursorPos;
- (*T*)
- BEGIN
- Escape('k');
- END RestoreCursorPos;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE AutoWrapOn;
- (*T*)
- BEGIN
- Escape('v');
- END AutoWrapOn;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE AutoWrapOff;
- (*T*)
- BEGIN
- Escape('w');
- END AutoWrapOff;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE InverseOn;
- (*T*)
- BEGIN
- Escape('p');
- END InverseOn;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE InverseOff;
- (*T*)
- BEGIN
- Escape('q');
- END InverseOff;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE SetForegroundColor ((* EIN/ -- *) farbe : CARDINAL );
- (*T*)
- BEGIN
- Escape('b'); WriteCon( CHR( 30H + ( farbe MOD 16 )));
- END SetForegroundColor;
-
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE SetBackgroundColor ((* EIN/ -- *) farbe : CARDINAL );
- (*T*)
- BEGIN
- Escape('c'); WriteCon( CHR( 30H + ( farbe MOD 16 )));
- END SetBackgroundColor;
-
-
-
- (*===========================================================================*)
-
- BEGIN (* Screen *)
-
- XBIOS2w( 0, 5, Cursconf );
- BlinkRate := REG( d0 );
-
- END Screen.
-